/*!
 *file name : frame_deal.c
 *author :hu
 *
 *description:
 */

#include "frame_deal.h"  


/*!
 *
 *说明：从接收缓冲pData中，找到符合要求的数据帧，拷贝至数据帧缓冲pFrame
		参数可以做调整，例如可以判断具体的指令，将数据帧存放到不同的buffer
 *参数：
 *返回值：
 */
UINT8 dataCheck(UINT8 *pData,UINT8 dataLen,UINT8 *pFrame,UINT8 *pFrameLen)
{
	UINT8 index,byteData,headCodeIndex,frameLen,status=0;
	UINT16 crcResult;
	State_t state=0;
	
	for(index=0;index<dataLen;index++)
	{
		byteData=pData[index];
		switch(state)
		{
			case STATE_IDLE:
				if(CODE_HEAD==byteData)
				{
					state=STATE_HEAD;
					headCodeIndex=index;
				}
				break;
			case STATE_HEAD:
				if(CODE_HEAD==byteData)
				{
					state=STATE_COMMAND;
				}		
				else
				{
					state=STATE_IDLE;
				}	
				break;
			case STATE_COMMAND:
				if(IF_COMMAND(byteData))//判断是否有该指令码
				{
					state=STATE_LEN;
				}	
				else if(CODE_HEAD==byteData)
				{
					state=STATE_IDLE;
					headCodeIndex++;
				}
				else
				{
					state=STATE_IDLE;
				}
				break;
			case STATE_LEN:

				if(dataLen-headCodeIndex >= byteData)//长度符合要求
				{
					frameLen=byteData;
					index = headCodeIndex + frameLen - 3;//将下标指向校验码前
					state=STATE_CRC_HIGH;
				}
				else
				{
					state=STATE_IDLE;
				}			
				break;
			case STATE_CRC_HIGHT:
				crcResult=byteData;
				crcResult<<=8;
				state=STATE_CRC_LOW;	
				break;
			case STATE_CRC_LOW:
				crcResult|=byteData;
				if(calculateCrc(&pData[headCodeIndex],frameLen-2)==crcResult)
				{
					state=STATE_CHECK_OK:
					index=dataLen;
				}
				else
				{
					state=STATE_IDLE;					
				}
				break;				
			default:
				state=STATE_IDLE;
				break;
		}
	}

	if(STATE_CHECK_OK==state)
	{
		status=1;
		*pFrameLen=frameLen;
		for(index=0;index<frameLen;index)
		{
			pFrame[index]=pData[headCodeIndex + index];
		}
	}
	return status;
}

/*!
 *
 *说明：根据数据帧的指令码，执行对应的帧处理
 *参数：
 *返回值：
 */
void frameHandle(UINT8 *pFrame,UINT8 frameLen)
{
	UINT8 command=pFrame[2];
	switch(command)
	{
		case CODE_COMMAND_80:
			deal80(pFrame,frameLen);
			break;
		case CODE_COMMAND_81:
			deal81(pFrame,frameLen);
			break;
		case CODE_COMMAND_82:
			deal82(pFrame,frameLen);
			break;
		default:
			//nothing
			break;

	}
}


/*!
 *
 *说明：具体帧处理
 *参数：
 *返回值：
 */
void deal80(UINT8 *pFrame,UINT8 frameLen)
{
	……
}
void deal81(UINT8 *pFrame,UINT8 frameLen)
{
	……
}
void deal82(UINT8 *pFrame,UINT8 frameLen)
{
	……
}